//request.cpp是使用正则表达式实现提取HTTP的请求

#include <iostream>
#include <string>
#include <regex>

int main()
{
    //使用正则表达式实现提取HTTP的请求
    //HTTP请求行格式：  GET /studentsystem/login?user=xiaoming&pass=123456 HTTP/1.1\r\n
    std::string str = "GET /studentsystem/login?user=xiaoming&pass=123456 HTTP/1.1\r\n";
    std::smatch matches; //存放提取好的HTTP内容
    //定义正则表达式的提取方式
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1\\.[01])(?:\n|\r\n)?");
    //(GET|HEAD|POST|PUT|DELETE) 是HTTP请求方式的提取，|表示都可以捕获
    //[^?] 匹配一个非问号字符 *匹配一次或者多次
    //\\?(.*)  匹配以问号后面的一个或者多个字符，直到碰到空格 \\?表示原始?
    //(HTTP/1\\.[01]) 匹配HTTP/1.因为.是原始字符要使用\\. 再匹配版本1或0 
    //(?:\n|\r\n)? (?: ...) 表示匹配某个格式字符串，但是不提取，最后的? 表示的是匹配前边的表达式0次或1次
    //(?:\\?(.*))? 匹配以问号后面的一个或者多个字符，不提取问号；匹配前面的表达式0次或1次

    //进行正则表达函数
    bool ret=std::regex_match(str,matches,e);
    if(ret==false)
    {
        return -1; //提取失败就返回错误
    }

    //打印提取的字符串
    for(int i=0;i<matches.size();i++)
    {
        std::cout<<i<<" : ";
        std::cout<<matches[i]<<std::endl;
    }
    return 0;
}